package fastcsv.utils;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @author 郝伟老师
 * @date 2020/02/19
 * @description 一个简单的Java方便写入类。
 * https://blog.csdn.net/weixin_43145361/article/details/104402176
 */
public class TextWriter {

	String filename;
	String cs;  
	RandomAccessFile raf;
	String seperator;


	void setSeperetor(){
		seperator = new File("C:").exists() ? "\r\n" : "\n";
	}

	/**
	 * 向一个文本文件中添加内容，默认编码为UTF8.
	 * @param filepath 文件路径。
	 */
	public TextWriter(String filepath) throws IOException {
		initialize(filename, false, "utf-8");
	}
	
	/**
	 * 向一个文本文件中添加内容，默认编码为UTF8.
	 * @param filepath 文件路径。
	 * @param append 是否追加。
	 * @throws IOException
	 */
	public TextWriter(String filename, Boolean append) throws IOException{
		initialize(filename, append, "utf-8");
	} 

	/**
	 * 向一个文本文件中添加内容，默认编码为UTF8.
	 * @param filepath 文件路径。
	 * @param append 是否追加。
	 * @param cs 编码格式，可以使用StandardCharsets表示。
	 * @throws IOException
	 */
	public TextWriter(String filename, Boolean append, String charset) throws IOException{
		initialize(filename, append, charset);
	} 

	private void initialize(String filename, Boolean append, String charset) throws IOException{
		this.filename = filename;
		this.cs = charset; 
		setSeperetor(); 		
		if(append) {
			raf = new RandomAccessFile(this.filename, "rw");
			raf.seek(raf.length());
		}else{
			File file = new File(filename);
			if(file.exists()) {
				file.delete();
			}
			raf = new RandomAccessFile(this.filename, "rw");
		}
	}
	
	/**
	 * 写入指定的字符。
	 * @param c 待写入字符。
	 * @throws IOException
	 */
	public void write(char c) throws IOException{
		write(c + "");
	}
	
	/**
	 * 写入指定的字符串。
	 * @param s 待写入字符串。
	 * @throws IOException
	 */
	public void write(String s) throws IOException{
		raf.write(s == null ? new byte[0] : s.getBytes(cs));
	}
	
	/**
	 * 写入指定的字符串，并自动追加换行符。
	 * @param s 待写入字符串。
	 * @throws IOException
	 */
	public void writeLine(String s) throws IOException {
		write(s);
		write(seperator);
	}
	
	public void close() throws IOException {
		if(raf != null)
			raf.close();
	}	
}

